package classes;

import java.util.ArrayList;
import java.util.Iterator;

import Exceptions.DadosInsuficientesExceptions;
import Exceptions.ItenJaCadastradoException;
import classes.Cadastra;

public class Usuario {
	
	private String nome, login;
	private Endereco endereco;
	private ArrayList<Iten> itensEmprestimo = new ArrayList<Iten>();
	private static ArrayList<Usuario> listAmigos = new ArrayList<Usuario>();
	private ArrayList<PedidoDeAmizade> listPedidosFeitos = new ArrayList<PedidoDeAmizade>();
	private ArrayList<PedidoDeAmizade> listPedidosRecebidos;
	
	TratamentoDeErros trataErros = new TratamentoDeErros();
	Cadastra usuariosCadastrados = new Cadastra();
	
	public Usuario(String nome, String login, Endereco endereco) throws DadosInsuficientesExceptions{
		this.nome = trataErros.validaString(nome);
		this.login = trataErros.validaString(login);
		this.endereco = endereco;
//		this.listPedidosFeitos = new ArrayList<PedidoDeAmizade>();
		this.listPedidosRecebidos = new ArrayList<PedidoDeAmizade>();
	}	
	public ArrayList<Usuario> getListAmigos(){
		return listAmigos;
	}
	
	public String listaAmigos(){
		String amigos = "";
		Iterator iterador = listAmigos.iterator();
		while(iterador.hasNext()){
			amigos = ((Usuario) iterador.next()).getNome() + "\n";
		}
		return amigos;
	}
	
	public String exibirPerfil1(Usuario usuario) {
		return usuario.toString() + "\n\n"
				+ "----------------------------------\n" + listaAmigos();
	}
	
	public String exibirPerfil(Usuario usuario){
		
		return usuario.toString() + "\n\n" + "----------------------------------\n" + listaAmigos();
	}
	
	public void cadastraItens(Iten novoIten) throws ItenJaCadastradoException{
		if (itensEmprestimo.contains(novoIten)){
			throw new ItenJaCadastradoException("Iten ja cadastrado.");
		}
		itensEmprestimo.add(novoIten);
	}
	
	public void requisitarAmizade(Usuario pediu, Usuario usuarioPedido,
			String mensagem) {
		PedidoDeAmizade pedido = new PedidoDeAmizade(pediu, usuarioPedido,
				mensagem);

		// usuarioPediu.getListPedidosFeitos().add(pedido);
		usuarioPedido.getListPedidosRecebidos().add(pedido);
	}
	
	/**
	 * Metodo aceita um pedido de amizade existente na lista de pedidos do
	 * usuario ,eh passado como parametro o usuario que fez o pedido e o que ira
	 * aceitar ,o metodo tbm adiciona tanto o usuario que recebeu e o que fez o
	 * pedido nas sua respectivas lista de amizade
	 * 
	 * **/
	public void aceitarAmizade(Usuario usuarioPediu,
			Usuario usuarioRecebeuPedido) {
		for (int i = 0; i < listPedidosRecebidos.size(); i++) {
			if (listPedidosRecebidos.get(i).getUsuarioPediu().equals(
					usuarioPediu)) {
				listPedidosRecebidos.remove(i);
			}
		}
		usuarioPediu.listAmigos.add(usuarioRecebeuPedido);
		usuarioRecebeuPedido.listAmigos.add(usuarioPediu);
	}

	public void rejeitarAmizade(Usuario usuario) {
		for (int i = 0; i < listPedidosRecebidos.size(); i++) {
			if (listPedidosRecebidos.get(i).getUsuarioPediu().equals(usuario)) {
				listPedidosRecebidos.remove(i);
			}
		}
	}

	public ArrayList<PedidoDeAmizade> getListPedidosRecebidos() {
		return listPedidosRecebidos;
	}

	public void verificarPedidosFeitos() {
		int deletar = 0;
		for (int i = 0; i < listPedidosFeitos.size(); i++) {

			if (listPedidosFeitos.get(i).getEstadoPedido() == EstadoAmizade.RECUSADA) {
				deletar = i;
			}

			if (listPedidosFeitos.get(i).getEstadoPedido() == EstadoAmizade.ACEITA) {
				deletar = i;
			}
		}
		listPedidosFeitos.remove(deletar);
	}

	public boolean verificaPedidosRecebidos(PedidoDeAmizade pedido,
			boolean simOuNao) {
		if (simOuNao == true) {
			for (PedidoDeAmizade p : this.listPedidosRecebidos) {
				if (pedido.equals(p)) {
					// Aceita pedido
					this.listAmigos.add(p.getUsuarioPediu());
					for (PedidoDeAmizade p1 : p.getUsuarioPediu()
							.getListPedidosFeitos()) {
						if (pedido.equals(p1)) {
							// Confirma pra quem pediu
							p1.setEstadoPedido(EstadoAmizade.ACEITA);
						}
					}
					listPedidosRecebidos.remove(p);
					return true;
				}
			}
		}
		for (PedidoDeAmizade p : listPedidosRecebidos) {
			if (pedido.equals(p)) {
				// recusa pediso
				for (PedidoDeAmizade p1 : p.getUsuarioPediu()
						.getListPedidosFeitos()) {
					if (pedido.equals(p1)) {
						// Confirma pra quem pediu
						p1.setEstadoPedido(EstadoAmizade.RECUSADA);
					}
				}
			}
			listPedidosRecebidos.remove(p);
			return false;
		}
		return false;
	}

	public ArrayList<PedidoDeAmizade> getListPedidosFeitos() {
		return listPedidosFeitos;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) throws DadosInsuficientesExceptions {
		this.nome = trataErros.validaString(nome);
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) throws DadosInsuficientesExceptions {
		this.login = trataErros.validaString(login);
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
	
	@Override
	public boolean equals(Object usuario) {

		if (!(usuario instanceof Usuario)) {
			return false;
		}
		Usuario usuario2 = (Usuario) usuario;
		if (getLogin().equals(usuario2.getLogin())) {
			return true;
		}
		return false;
	}	
	
	@Override
	public String toString(){
		return ("Nome: " + getNome() + "\n" + endereco.toString());
	}
}